sklearn 进行 K-Means 聚类建模聚类 是一种 无监督学习 方法:
金融场景应用:客户细分、风险识别、精准营销
# ==================== 导入必要的库 ====================
import pandas as pd # 数据处理库
import numpy as np # 数值计算库
from sklearn.cluster import KMeans # K-Means聚类算法
from sklearn.metrics import silhouette_score # 轮廓系数评估指标
import matplotlib.pyplot as plt # 绘图库
import seaborn as sns # 统计绘图库
# ==================== 读取数据 ====================
# 读取信用卡用户数据,包含用户ID和各种消费行为特征
data = pd.read_csv('09_CC GENERAL.csv')
# ==================== 数据探索 ====================
print('数据形状:', data.shape)
print('\n数据预览:')
print(data.head())# ==================== 数据清洗 ====================
# 删除客户ID列,因为聚类算法不应受ID影响
data_clean = data.drop(['CUST_ID'], axis=1)
# ==================== 处理缺失值 ====================
# 使用前向填充方法处理缺失值
data_clean.fillna(method='ffill', inplace=True)
print(f'缺失值处理后剩余缺失值: {data_clean.isnull().sum().sum()}')
# ==================== 数据描述统计 ====================
print('\n数据描述统计:')
print(data_clean.describe())# 注:09_CC GENERAL.csv数据文件本地没有,但平台已经内置
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import pandas as pd # 导入Pandas数据分析库
data = pd.read_csv('09_CC GENERAL.csv') # 从CSV文件读取数据存入data
# 数据处理
data.drop(['CUST_ID'], axis=1, inplace=True)
data.fillna(method='ffill', inplace=True) # 使用前向填充法处理缺失值
from sklearn.cluster import KMeans # 导入Scikit-learn的KMeans模块
import matplotlib.pyplot as plt # 导入Matplotlib绑图库
# 使用Kmeans算法对数据进行聚类
kmeans = KMeans(n_clusters=5, n_init=10, max_iter=300,algorithm="elkan", random_state=42)
kmeans.fit(data) # 在数据上训练kmeans模型
# 可视化展示聚类结果
plt.scatter(data.iloc[:, 0], data.iloc[:, 1], c=kmeans.labels_, cmap='viridis')
plt.savefig("s.png") # 保存图形至文件
plt.show() # 显示图形
# 分析不同类别的用户特征和行为差异
data['cluster'] = kmeans.labels_
cluster_summary = data.groupby('cluster').mean() # 按指定列分组聚合
print(cluster_summary) # 输出聚类数据
# 对聚类结果进行评估
from sklearn.metrics import silhouette_score
print(silhouette_score(data, kmeans.labels_)) # 输出均值数据| 代码 | 含义 |
|---|---|
pd.read_csv(...) |
从 CSV 文件读取数据 |
data.drop(['CUST_ID'], ...) |
删除客户 ID 列 |
data.fillna(method='ffill') |
前向填充缺失值 |
KMeans(n_clusters=5, ...) |
创建 5 簇的 K-Means 模型 |
kmeans.fit(data) |
在数据上训练模型 |
| 代码 | 含义 |
|---|---|
plt.scatter(...) |
绘制聚类散点图 |
c=kmeans.labels_ |
用簇标签着色 |
data.groupby('cluster').mean() |
按簇计算各特征均值 |
silhouette_score(...) |
计算轮廓系数评估质量 |
关键参数说明:
n_clusters=5:分为 5 个簇n_init=10:随机初始化 10 次取最优max_iter=300:最大迭代 300 次# ==================== 可视化前两维特征的聚类结果 ====================
plt.figure(figsize=(10, 8))
scatter = plt.scatter(
data_clean.iloc[:, 0], # x坐标:第一个特征
data_clean.iloc[:, 1], # y坐标:第二个特征
c=labels, # 颜色根据簇标签着色
cmap='viridis', # 使用viridis配色方案
s=50, # 点的大小
alpha=0.6 # 透明度
)
plt.colorbar(scatter, label='Cluster')
plt.title('信用卡用户聚类结果', fontsize=14)
plt.xlabel('特征1', fontsize=12)
plt.ylabel('特征2', fontsize=12)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()# ==================== 按簇统计特征均值 ====================
cluster_summary = data_clean.groupby('cluster').mean()
print('各簇平均特征:')
print(cluster_summary)
# ==================== 计算轮廓系数 ====================
silhouette_avg = silhouette_score(data_clean.iloc[:, :-1], labels)
print(f'\n平均轮廓系数: {silhouette_avg:.4f}')
# ==================== 轮廓系数解读 ====================
print('\n轮廓系数解读:')
if silhouette_avg > 0.5:
print(' 聚类效果良好,簇间分离度高')
elif silhouette_avg > 0.2:
print(' 聚类效果中等,可考虑调整K值或特征')
else:
print(' 聚类效果较差,建议重新选择特征或算法')[商业大数据分析与应用]